RAIS  3.2
C:/Projekte/RAIS/MigrationTool/Table.cs
Go to the documentation of this file.
00001 using System;
00002 using System.Collections.Generic;
00003 using System.Text;
00004 using System.Data.Common;
00005 using System.Data.SqlClient;
00006 using System.Data.OleDb;
00007 
00008 
00009 namespace RAISInstall
00010 {
00011     public class Table:IDisposable
00012     {
00013         SqlConnection sqlConnection;
00014         OleDbConnection accessConnection;
00015         DbDataReader accessReader;
00016         string[] names ;
00017         Type[] types;
00018 
00019         string _sourceTableName;
00020         string _destTableName;
00021         string createTableCommand = "create Table {0}({1})";
00022         string dropTableCommand = "IF EXISTS (SELECT * FROM sysobjects WHERE type = 'U' AND name = '{0}') " +
00023                                 "BEGIN " +
00024                                     "DROP  Table [{0}] " +
00025                                 "END ";
00026 
00027         string insertCommand="INSERT into {0}({1}) values({2})";
00028 
00029         public Table(string accessConnectionString, string sqlConnectionString)
00030         {
00031             sqlConnection = new SqlConnection(sqlConnectionString);
00032             accessConnection = new OleDbConnection(accessConnectionString);
00033             sqlConnection.Open();
00034             accessConnection.Open();
00035         }
00036 
00037         private void Drop()
00038         {
00039             DbCommand toCommand = new SqlCommand(string.Format(dropTableCommand, _destTableName), sqlConnection);
00040             toCommand.ExecuteNonQuery();
00041         }
00042 
00043         private void Create()
00044         {
00045             StringBuilder body=new StringBuilder();
00046             for (int i = 0; i < names.Length; i++)
00047             {
00048                 body.Append("[");
00049                 body.Append(names[i]);
00050                 body.Append("] ");
00051                 
00052                 body.Append(GetSQLType(types[i]));
00053                 if(names.Length-1!=i)
00054                     body.Append(",");
00055             }
00056             DbCommand toCommand = new SqlCommand(string.Format(createTableCommand,_destTableName, body.ToString()), sqlConnection);
00057             toCommand.ExecuteNonQuery();
00058         }
00059 
00060         public string GetSQLType(Type type)
00061         { 
00062             switch(type.Name)
00063             {
00064                 case "Int32":
00065                     return "int";
00066                 case "String":
00067                     return "[nvarchar](max)";
00068                 case "Boolean":
00069                     return "tinyint";
00070                 default:
00071                     break;
00072             }
00073             return "";
00074         }
00075 
00076         public void Copy(string sourceTable, string destTable)
00077         {
00078             _sourceTableName = sourceTable;
00079             _destTableName = destTable;
00080             DbCommand accessCommand = new OleDbCommand(string.Format("select * from [{0}]", _sourceTableName), accessConnection);
00081             accessReader = accessCommand.ExecuteReader();
00082             names = new string[accessReader.FieldCount];
00083             types = new Type[accessReader.FieldCount];
00084             
00085             for (int i = 0; i < accessReader.FieldCount; i++)
00086             {
00087                 names[i] = accessReader.GetName(i);
00088                 types[i] = accessReader.GetFieldType(i);
00089             }
00090             Drop();
00091             Create();
00092             DataCopy();
00093         }
00094 
00095         private void DataCopy()
00096         {
00097             StringBuilder fields = new StringBuilder();
00098             for (int i = 0; i < names.Length; i++)
00099             {
00100                 fields.Append("[");
00101                 fields.Append(names[i]);
00102                 fields.Append("]");
00103                 if (names.Length - 1 != i)
00104                     fields.Append(",");
00105             }
00106 
00107             StringBuilder values = new StringBuilder();
00108             DbCommand toCommand = new SqlCommand();
00109             toCommand.Connection = sqlConnection;
00110 
00111             while (accessReader.Read())
00112             {
00113                 for (int i = 0; i < types.Length; i++)
00114                 {
00115                     if (accessReader[i] is DBNull)
00116                         values.Append("null");
00117                     else
00118                     {
00119                         if (types[i].Name == "String")
00120                             AppendString(values, accessReader[i]);                            
00121                         else if (types[i].Name == "Boolean")
00122                             if (((Boolean)accessReader[i]))
00123                                 values.Append("1");
00124                             else
00125                                 values.Append("0");
00126                         else
00127                             values.Append(accessReader[i].ToString());
00128                     }
00129                     if (names.Length - 1 != i)
00130                         values.Append(",");
00131                 }
00132                 toCommand.CommandText = string.Format(insertCommand, _destTableName, fields.ToString(), values.ToString());
00133                 toCommand.ExecuteNonQuery();
00134                 values = new StringBuilder();
00135             }
00136         }
00137 
00138         private void AppendString(StringBuilder sb, object o )
00139         {
00140             sb.Append("N'");
00141             sb.Append(o.ToString().Replace("'","''"));
00142             sb.Append("'");
00143         }
00144         
00145 
00146         public void Dispose()
00147         {
00148             sqlConnection.Close();
00149             accessConnection.Close();
00150         }
00151     }
00152 }